/*
 * Copyright (C) 2013 Manoel Afonso Filho
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package agimagem.concrete;

import agimagem.populacao.Individuo;
import agimagem.populacao.Populacao;
import agimagem.strategy.Replacement;
import java.util.ArrayList;
import java.util.Collections;

/**
 * Implementação da Seleção dos Sobreviventes (Replacement). Os indivíduos que
 * passaram pelo crossover e mutação (offspring) vão substituir os indivíduos
 * com menor fitness na população.
 * @author Manoel Afonso Filho
 */
public class ImgReplacement implements Replacement {

    /**
     * {@inheritDoc} <b>OBS.:</b> O tamanho da offspring <b>deve</b> ser menor que o tamanho da população original.
     * Nenhuma verificação é feita quanto a isso.
     * @param original {@inheritDoc}
     * @param offspring {@inheritDoc}
     * @return {@inheritDoc}
     */
    @Override
    public Populacao executar(Populacao original, Populacao offspring) {
        // Ordena os indivíduos do menor para o maior de acordo com o fitness.
        ArrayList<Individuo> indOri = original.getIndividuos();
        Collections.sort(indOri);
        // Insere a offspring na população. Isto é feito por referência.
        for (int i = 0; i < offspring.getTamanhoPop(); i++) {
            indOri.set(i, offspring.getIndividuoAt(i));
        }

        return original;
    }

}
